﻿#ifndef WEBSOCKETCLIENT_H
#define WEBSOCKETCLIENT_H

#include <QObject>
#include <QWebSocket>
#include <QUrl>
#include <QStringList>
#include <QMap>
#include <QAbstractSocket>
#include <QFile>
#include <QTimer>

class WebSocketClient : public QObject
{
    Q_OBJECT
public:
    explicit WebSocketClient(const QUrl &url,QObject *parent = nullptr);
    ~WebSocketClient();
    void attemptReconnect(); // 连接websocket服务器的URL
    void close();// 关闭websocket

    void sendTextMsg(const QString &message);// 发送Text类型的消息

    void sendBinaryMsg(const QByteArray &data);// 发送Binary类型的消息
    void sendBinaryMsg(QFile &file);// 发送Binary类型的消息

    void setUrl(const QUrl &url);
signals:
    void logout();
    void sigRecvTextMsg(const QString &message); // 接受到Text类型消息的信号
    void sigRecvBinaryMsg(const QByteArray &message);

private slots:
    void slotConnected(); // 连接成功时调用
    void slotDisconnected(); // 断开连接时调用
    void slotRecvTextMsg(const QString &message); // 接受字符数据
    void slotRecvBinaryMsg(const QByteArray &message); // 接受二进制数据
    void slotError(QAbstractSocket::SocketError error); // 响应报错时调用

private:

    QUrl m_url; // 存放连接的url
    QWebSocket *WebSocket;
    bool m_bConnected = false; // 为true,表明已连接服务器，否则未连接上

    QTimer *m_reconnectTimer; //定时器
    int m_reconnectAttempts; //尝试次数
    int m_maxReconnectAttempts; //最大尝试次数
    int m_reconnectInterval; // 重连间隔（毫秒）

    // 返回服务器连接状态
    bool getConStatus();
};

#endif // WEBSOCKETCLIENT_H
